home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gigarom 1
/
Gigarom Macintosh Archives (Quantum Leap)(CDRM1080320)(1993).iso
/
FILES
/
DEV
/
I-Z
/
Xlisp_Source.cpt
/
xlstr.c
< prev
next >
Wrap
Text File
|
1985-01-27
|
4KB
|
203 lines
/* xlstr - xlisp string builtin functions */
#include "xlisp.h"
/* external variables */
extern NODE *xlstack;
/* external procedures */
extern char *strcat();
/* xstrlen - length of a string */
NODE *xstrlen(args)
NODE *args;
{
NODE *val;
int total;
/* initialize */
total = 0;
/* loop over args and total */
while (args)
total += strlen(xlmatch(STR,&args)->n_str);
/* create the value node */
val = newnode(INT);
val->n_int = total;
/* return the total */
return (val);
}
/* xstrcat - concatenate a bunch of strings */
NODE *xstrcat(args)
NODE *args;
{
NODE *oldstk,val,*p;
char *str;
int len;
/* create a new stack frame */
oldstk = xlsave(&val,NULL);
/* find the length of the new string */
for (p = args, len = 0; p; )
len += strlen(xlmatch(STR,&p)->n_str);
/* create the result string */
val.n_ptr = newnode(STR);
val.n_ptr->n_str = str = stralloc(len);
*str = 0;
/* combine the strings */
while (args)
strcat(str,xlmatch(STR,&args)->n_str);
/* restore the previous stack frame */
xlstack = oldstk;
/* return the new string */
return (val.n_ptr);
}
/* xsubstr - return a substring */
NODE *xsubstr(args)
NODE *args;
{
NODE *oldstk,arg,src,val;
int start,forlen,srclen;
char *srcptr,*dstptr;
/* create a new stack frame */
oldstk = xlsave(&arg,&src,&val,NULL);
/* initialize */
arg.n_ptr = args;
/* get string and its length */
src.n_ptr = xlmatch(STR,&arg.n_ptr);
srcptr = src.n_ptr->n_str;
srclen = strlen(srcptr);
/* get starting pos -- must be present */
start = xlmatch(INT,&arg.n_ptr)->n_int;
/* get length -- if not present use remainder of string */
forlen = (arg.n_ptr ? xlmatch(INT,&arg.n_ptr)->n_int : srclen);
/* make sure there aren't any more arguments */
xllastarg(arg.n_ptr);
/* don't take more than exists */
if (start + forlen > srclen)
forlen = srclen - start + 1;
/* if start beyond string -- return null string */
if (start > srclen) {
start = 1;
forlen = 0; }
/* create return node */
val.n_ptr = newnode(STR);
val.n_ptr->n_str = dstptr = stralloc(forlen);
/* move string */
for (srcptr += start-1; forlen--; *dstptr++ = *srcptr++)
;
*dstptr = 0;
/* restore the previous stack frame */
xlstack = oldstk;
/* return the substring */
return (val.n_ptr);
}
/* xascii - return ascii value */
NODE *xascii(args)
NODE *args;
{
NODE *val;
/* build return node */
val = newnode(INT);
val->n_int = *(xlmatch(STR,&args)->n_str);
/* make sure there aren't any more arguments */
xllastarg(args);
/* return the character */
return (val);
}
/* xchr - convert an INT into a one character ascii string */
NODE *xchr(args)
NODE *args;
{
NODE *oldstk,val;
char *sptr;
/* create a new stack frame */
oldstk = xlsave(&val,NULL);
/* build return node */
val.n_ptr = newnode(STR);
val.n_ptr->n_str = sptr = stralloc(1);
*sptr++ = xlmatch(INT,&args)->n_int;
*sptr = 0;
/* make sure there aren't any more arguments */
xllastarg(args);
/* restore the previous stack frame */
xlstack = oldstk;
/* return the new string */
return (val.n_ptr);
}
/* xatoi - convert an ascii string to an integer */
NODE *xatoi(args)
NODE *args;
{
NODE *val;
int n;
/* get the string and convert it */
n = atoi(xlmatch(STR,&args)->n_str);
/* make sure there aren't any more arguments */
xllastarg(args);
/* create the value node */
val = newnode(INT);
val->n_int = n;
/* return the number */
return (val);
}
/* xitoa - convert an integer to an ascii string */
NODE *xitoa(args)
NODE *args;
{
NODE *val;
char buf[20];
int n;
/* get the integer */
n = xlmatch(INT,&args)->n_int;
xllastarg(args);
/* convert it to ascii */
sprintf(buf,"%d",n);
/* create the value node */
val = newnode(STR);
val->n_str = strsave(buf);
/* return the string */
return (val);
}